﻿using System;
using System.Collections.Generic;
using System.Text;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Columns;
using System.Drawing;
using System.Data;
using ProtocolVN.Framework.Core;

namespace ProtocolVN.Framework.Win
{
    /// <summary>
    /// DUYVT
    /// Ràng buộc về xóa phiếu Nhập/Chuyển kho.
    /// Kiểm tra xem lượng hàng tồn kho đủ để hoàn lại hay không
    /// </summary>
    public class RangBuocDeletePhieuTonKho : RangBuocRule
    {       
        DataTable DetailDataTable;
        DateTime? Ngay_phat_sinh;
        PhieuType Des;
        long Kho_Id;

        public RangBuocDeletePhieuTonKho() { }

        public RangBuocDeletePhieuTonKho(DataSet DetailDataSet,
            PhieuType Des, long Kho_Id, DateTime? Ngay_Nhap)
        {
            this.DetailDataTable = DetailDataSet.Tables[0];
            this.Des = Des;
            this.Ngay_phat_sinh = Ngay_Nhap;
            this.Kho_Id = Kho_Id;
        }

        public RangBuocDeletePhieuTonKho(DataSet DetailDataSet,
            DataSet GridDataSetSrc, PhieuType Des, long Kho_Id, DateTime? Ngay_Nhap)
        {            
            if (DetailDataSet != null && DetailDataSet.Tables.Count > 0)
            {                
                foreach (DataRow rowLast in DetailDataSet.Tables[0].Rows)
                {                   
                    if (rowLast.RowState != DataRowState.Deleted)
                    {
                        foreach (DataRow rowFirst in GridDataSetSrc.Tables[0].Rows)
                        {
                            if (rowLast.RowState == DataRowState.Added)
                            {
                                rowLast[Des.GetSOLGField()] = 0;
                                rowLast[Des.GetTRLGField()] = 0;
                            }
                            else
                            {
                                if ((HelpNumber.ParseInt64(rowLast["HH_ID"]) ==
                                    HelpNumber.ParseInt64(rowFirst["HH_ID"]))
                                    && (HelpNumber.ParseInt64(rowLast[Des.GetSTTField()]) ==
                                    HelpNumber.ParseInt64(rowFirst[Des.GetSTTField()])))
                                {                                    
                                    rowLast[Des.GetSOLGField()] =
                                        HelpNumber.ParseDecimal(rowLast[Des.GetSOLGField()]) -
                                        HelpNumber.ParseDecimal(rowFirst[Des.GetSOLGField()]);
                                    if (HelpNumber.ParseDecimal(rowLast[Des.GetSOLGField()]) > 0)
                                        rowLast[Des.GetSOLGField()] = 0;
                                    else
                                    {
                                        rowLast[Des.GetSOLGField()] =
                                            (-1) * HelpNumber.ParseDecimal(rowLast[Des.GetSOLGField()]);
                                    }

                                    rowLast[Des.GetTRLGField()] =
                                        HelpNumber.ParseDecimal(rowLast[Des.GetTRLGField()]) -
                                        HelpNumber.ParseDecimal(rowFirst[Des.GetTRLGField()]);
                                    if (HelpNumber.ParseDecimal(rowLast[Des.GetTRLGField()]) > 0)
                                        rowLast[Des.GetTRLGField()] = 0;
                                    else
                                    {
                                        rowLast[Des.GetTRLGField()] =
                                            (-1) * HelpNumber.ParseDecimal(rowLast[Des.GetTRLGField()]);
                                    }
                                }
                            }
                        }
                    }
                }
                List<DataRow> row_deleted = new List<DataRow>();
                foreach (DataRow rowFirst in GridDataSetSrc.Tables[0].Rows)
                {
                    bool IsRowDeleted = false;
                    foreach (DataRow rowLast in DetailDataSet.Tables[0].Rows)
                    {
                        if (rowLast.RowState != DataRowState.Deleted &&
                            (HelpNumber.ParseInt64(rowLast["HH_ID"]) ==
                            HelpNumber.ParseInt64(rowFirst["HH_ID"]))
                            && (HelpNumber.ParseInt64(rowLast[Des.GetSTTField()]) ==
                            HelpNumber.ParseInt64(rowFirst[Des.GetSTTField()])))
                            IsRowDeleted = true;
                    }
                    if (!IsRowDeleted)
                        row_deleted.Add(rowFirst);
                }
                foreach (DataRow row in row_deleted)
                    DetailDataSet.Tables[0].ImportRow(row);                
                this.DetailDataTable = DetailDataSet.Tables[0];                
            }
            this.Des = Des;
            this.Ngay_phat_sinh = Ngay_Nhap;
            this.Kho_Id = Kho_Id;
        }

        #region RangBuocRule Members

        public List<InvalidInfo> Check()
        {
            List<InvalidInfo> ret = new List<InvalidInfo>();
            bool flag = KiemTraRangBuocXoaNhap();
            if (flag == false)
            {
                ret.Add(new InvalidInfo(
                    "Xóa hay cập nhật giảm hàng hóa trong phiếu này sẽ làm dữ liệu tồn kho âm",
                    "Cần nhập thêm hàng hóa tương tự vào kho hay điều chỉnh lại dữ liệu cần cập nhật",                
                    InvalidInfo.InvalidType.ERROR));
            }
            return ret;
        }
        #endregion        

        /// <summary>
        /// Kiểm tra ràng buộc về tồn kho
        /// </summary>        
        /// <returns>True/False</returns>
        public bool KiemTraRangBuocXoaNhap()
        {            
            if (DetailDataTable == null || DetailDataTable.Rows.Count == 0)
                return true;

            foreach (DataRow dr_dich in DetailDataTable.Rows)
            {
                if (dr_dich.RowState != DataRowState.Deleted)
                {
                    long kkd_id = KhoTonKhoHelp.GetKy(this.Ngay_phat_sinh);
                    int error_code = KhoTonKhoHelp.CheckHangHoaTonKhoIsHopLe(
                        HelpNumber.ParseInt64(dr_dich["HH_ID"]), Kho_Id,
                        HelpNumber.ParseInt64(dr_dich[Des.GetSTTField()]), kkd_id,
                        HelpNumber.ParseDecimal(dr_dich[Des.GetSOLGField()]),
                        HelpNumber.ParseDecimal(dr_dich[Des.GetTRLGField()]));

                    if (error_code == -5)
                    {
                        PLMessageBoxDev.ShowMessage(
                            "Đã có lỗi trong quá trình kiểm tra lượng hàng tồn kho");
                        return false;
                    }
                    else if (error_code > -4 && error_code < 0)
                        return false;
                }
            }
            return true;
        }        
    }
}
